<!doctype html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JVM对象晋升机制详解</title>
    <link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css">
    <link rel="stylesheet" href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
            min-height: 100vh;
        }
        
        .hero-gradient {
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        }
        
        .card-hover {
            transition: all 0.3s ease;
            border: 2px solid transparent;
        }
        
        .card-hover:hover {
            transform: translateY(-5px);
            box-shadow: 0 20px 40px rgba(0,0,0,0.1);
            border-color: #667eea;
        }
        
        .number-circle {
            width: 48px;
            height: 48px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
            display: flex;
            align-items: center;
            justify-content: center;
            border-radius: 50%;
            font-weight: bold;
            font-size: 20px;
            flex-shrink: 0;
        }
        
        .section-title {
            position: relative;
            padding-left: 20px;
        }
        
        .section-title::before {
            content: '';
            position: absolute;
            left: 0;
            top: 50%;
            transform: translateY(-50%);
            width: 4px;
            height: 100%;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        }
        
        .code-style {
            background: #f3f4f6;
            padding: 2px 8px;
            border-radius: 4px;
            font-family: 'Courier New', monospace;
            color: #5b21b6;
            font-size: 14px;
        }
        
        .highlight-box {
            background: linear-gradient(135deg, #ffeaa7 0%, #fab1a0 100%);
            padding: 20px;
            border-radius: 12px;
            margin: 20px 0;
            position: relative;
            overflow: hidden;
        }
        
        .highlight-box::before {
            content: '\f0eb';
            font-family: 'Font Awesome 6 Free';
            font-weight: 900;
            position: absolute;
            right: 20px;
            top: 20px;
            font-size: 40px;
            opacity: 0.2;
        }
        
        @keyframes fadeInUp {
            from {
                opacity: 0;
                transform: translateY(30px);
            }
            to {
                opacity: 1;
                transform: translateY(0);
            }
        }
        
        .animate-fade-in {
            animation: fadeInUp 0.8s ease-out;
        }
        
        .mermaid {
            display: flex;
            justify-content: center;
            margin: 40px 0;
        }
    </style>
</head>
<body>
    <!-- Hero Section -->
    <div class="hero-gradient text-white py-20">
        <div class="container mx-auto px-6">
            <div class="max-w-4xl mx-auto text-center animate-fade-in">
                <h1 class="text-5xl font-bold mb-6" style="font-family: 'Noto Serif SC', serif;">
                    JVM对象晋升机制深度解析
                </h1>
                <p class="text-xl opacity-90 leading-relaxed">
                    探索Java虚拟机中新生代对象如何晋升到老年代的核心机制，
                    理解垃圾收集器的智慧决策过程
                </p>
                <div class="mt-8 flex justify-center space-x-4">
                    <span class="bg-white bg-opacity-20 px-4 py-2 rounded-full text-sm">
                        <i class="fas fa-clock mr-2"></i>阅读时间：8分钟
                    </span>
                    <span class="bg-white bg-opacity-20 px-4 py-2 rounded-full text-sm">
                        <i class="fas fa-layer-group mr-2"></i>深度技术文章
                    </span>
                </div>
            </div>
        </div>
    </div>

    <!-- Main Content -->
    <div class="container mx-auto px-6 py-12">
        <div class="max-w-5xl mx-auto">
            
            <!-- Introduction Card -->
            <div class="bg-white rounded-2xl shadow-xl p-8 mb-8 card-hover">
                <div class="flex items-start">
                    <i class="fas fa-info-circle text-4xl text-purple-600 mr-4 mt-1"></i>
                    <div>
                        <h2 class="text-2xl font-bold mb-4 text-gray-800">核心概念</h2>
                        <p class="text-gray-600 leading-relaxed text-lg">
                            新生代对象晋升到老年代是JVM内存管理的关键机制。主要包括对象年龄达到阈值、Survivor区满、
                            老年代空间压力、垃圾收集器特定行为和Full GC期间的晋升等情况。理解这些机制对于优化Java应用性能至关重要。
                        </p>
                    </div>
                </div>
            </div>

            <!-- Mermaid Diagram -->
            <div class="bg-white rounded-2xl shadow-xl p-8 mb-8">
                <h3 class="text-xl font-bold mb-6 text-center text-gray-800">对象晋升流程图</h3>
                <div class="mermaid">
                    graph TD
                        A[Eden区对象] -->|Minor GC| B{存活?}
                        B -->|是| C[移至Survivor区]
                        B -->|否| D[回收]
                        C --> E{年龄达到阈值?}
                        E -->|是| F[晋升到老年代]
                        E -->|否| G[继续在Survivor区]
                        G --> H{Survivor区满?}
                        H -->|是| F
                        H -->|否| I[等待下次GC]
                        I --> B
                        J[Full GC触发] --> F
                        K[老年代空间压力] --> F
                </div>
            </div>

            <!-- Main Sections -->
            <div class="space-y-8">
                
                <!-- Section 1 -->
                <div class="bg-white rounded-2xl shadow-xl p-8 card-hover">
                    <div class="flex items-start">
                        <div class="number-circle">1</div>
                        <div class="ml-6 flex-1">
                            <h3 class="text-2xl font-bold mb-4 section-title">对象年龄达到晋升阈值</h3>
                            
                            <div class="space-y-4">
                                <div class="bg-purple-50 rounded-lg p-6">
                                    <h4 class="font-bold text-lg mb-3 text-purple-800">
                                        <i class="fas fa-birthday-cake mr-2"></i>年龄计数机制
                                    </h4>
                                    <p class="text-gray-700 leading-relaxed">
                                        在新生代中，Eden区的对象经过多次垃圾收集（Minor GC）仍然存活时，它们会被移到Survivor区。
                                        在Survivor区存活的对象会逐渐增加其年龄（即存活的代数）。当对象在Survivor区达到一定的年龄
                                        （通常为15或15次Minor GC）时，它们会被晋升到老年代。
                                    </p>
                                </div>
                                
                                <div class="bg-blue-50 rounded-lg p-6">
                                    <h4 class="font-bold text-lg mb-3 text-blue-800">
                                        <i class="fas fa-cog mr-2"></i>阈值设置
                                    </h4>
                                    <p class="text-gray-700 leading-relaxed">
                                        JVM的默认设置通常为15次Minor GC，但这个阈值可以通过 
                                        <span class="code-style">-XX:MaxTenuringThreshold</span> 参数进行调整。
                                        比如，<span class="code-style">-XX:MaxTenuringThreshold=10</span> 
                                        表示对象在Survivor区经过10次GC后将被晋升到老年代。
                                    </p>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

                <!-- Section 2 -->
                <div class="bg-white rounded-2xl shadow-xl p-8 card-hover">
                    <div class="flex items-start">
                        <div class="number-circle">2</div>
                        <div class="ml-6 flex-1">
                            <h3 class="text-2xl font-bold mb-4 section-title">Survivor区满</h3>
                            
                            <div class="space-y-4">
                                <div class="bg-orange-50 rounded-lg p-6">
                                    <h4 class="font-bold text-lg mb-3 text-orange-800">
                                        <i class="fas fa-exclamation-triangle mr-2"></i>空间不足
                                    </h4>
                                    <p class="text-gray-700 leading-relaxed">
                                        如果Survivor区（S0和S1）的空间不足以容纳新生代的存活对象，某些存活的对象将被直接晋升到老年代。
                                        这种情况发生在Survivor区满或即将满时，JVM会尝试将一部分对象晋升到老年代，以释放Survivor区的空间。
                                    </p>
                                </div>
                                
                                <div class="bg-green-50 rounded-lg p-6">
                                    <h4 class="font-bold text-lg mb-3 text-green-800">
                                        <i class="fas fa-route mr-2"></i>晋升策略
                                    </h4>
                                    <p class="text-gray-700 leading-relaxed">
                                        具体的晋升策略和触发条件会依赖于垃圾收集器的实现和配置。例如，G1垃圾收集器会根据回收的目标
                                        和堆的状况决定是否将对象晋升到老年代。
                                    </p>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

                <!-- Section 3 -->
                <div class="bg-white rounded-2xl shadow-xl p-8 card-hover">
                    <div class="flex items-start">
                        <div class="number-circle">3</div>
                        <div class="ml-6 flex-1">
                            <h3 class="text-2xl font-bold mb-4 section-title">老年代空间压力</h3>
                            
                            <div class="space-y-4">
                                <div class="bg-red-50 rounded-lg p-6">
                                    <h4 class="font-bold text-lg mb-3 text-red-800">
                                        <i class="fas fa-compress-alt mr-2"></i>老年代空间不足
                                    </h4>
                                    <p class="text-gray-700 leading-relaxed">
                                        如果老年代的空间已经满了，并且没有足够的空间来容纳晋升的对象，那么垃圾收集器（如G1或CMS）
                                        会触发Full GC，试图清理老年代的空间。然而，在某些情况下，如果空间压力过大，老年代的可用空间
                                        仍然不足，可能会导致新生代对象被直接晋升到老年代。
                                    </p>
                                </div>
                                
                                <div class="bg-pink-50 rounded-lg p-6">
                                    <h4 class="font-bold text-lg mb-3 text-pink-800">
                                        <i class="fas fa-times-circle mr-2"></i>晋升失败
                                    </h4>
                                    <p class="text-gray-700 leading-relaxed">
                                        如果老年代的回收过程不能释放足够的空间来容纳即将晋升的对象，这些对象可能会被晋升到老年代。
                                    </p>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

                <!-- Section 4 -->
                <div class="bg-white rounded-2xl shadow-xl p-8 card-hover">
                    <div class="flex items-start">
                        <div class="number-circle">4</div>
                        <div class="ml-6 flex-1">
                            <h3 class="text-2xl font-bold mb-4 section-title">特定的垃圾收集器行为</h3>
                            
                            <div class="bg-indigo-50 rounded-lg p-6">
                                <h4 class="font-bold text-lg mb-3 text-indigo-800">
                                    <i class="fas fa-recycle mr-2"></i>CMS和G1垃圾收集器
                                </h4>
                                <p class="text-gray-700 leading-relaxed">
                                    CMS和G1垃圾收集器在处理新生代对象晋升时具有不同的策略。例如，CMS在进行